/* 
 * File:   Float.h
 * Author: mariano
 *
 * Created on December 20, 2009, 11:29 AM
 */

#ifndef __FLOAT__
#define __FLOAT__

#include <vector>
#include <string>
#include "defines.h"

using namespace std;

class Float{

	public:

		/**
		 * Constructores
		 */
		Float();
		Float(const string&);
		Float(const float&);
//		no uso memoria dinamica, ni estructuras complejas.
//              Float(const Float&);
//		~Float();
//		Float& operator=(const Float&);

		/**cout
		 * operadores de comparacion
		 */
		bool operator== (const Float&) const;
		bool operator!=(const Float&) const;
		bool operator<(const Float&) const;
		bool operator<=(const Float&) const;
		bool operator>(const Float&) const;
		bool operator>=(const Float&) const;
                bool similar(const Float&) const;
		/**
		 * operadores aritmeticos
		 */
		Float operator+(const Float&) const;
		Float operator-(const Float&) const;
		Float operator*(const Float&) const;
		Float operator>>(const unsigned int&);


		/**
		 * operadores de asignacion y aritmeticos
		 */
		void operator+=(const Float&);
		void operator-=(const Float&);
		void operator*=(const Float&);
		void operator>>=(unsigned int);

		string mostrar() const;
                static void setLimit(int i);
                static int getLimit();
		Float modulo() const;
                
	private:
            void normalizar();
            void init(const string & num);
            // mantisa[0] es la parte mas significativa (big-indian)
            vector<byte> mantisa;
            int exponente;
            bool signo;
            static int limit;

};

ostream& operator<<(ostream& out, const Float& f);

#endif	/* __FLOAT__ */

